package br.com.toscano.contpedido.view;

import java.io.ByteArrayInputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.inject.Inject;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.com.toscano.contpedido.business.LocalProducaoBC;
import br.com.toscano.contpedido.business.ProdutoBC;
import br.com.toscano.contpedido.business.UnidadeMedidaBC;
import br.com.toscano.contpedido.domain.LocalProducao;
import br.com.toscano.contpedido.domain.Produto;
import br.com.toscano.contpedido.domain.ProdutoProduto;
import br.com.toscano.contpedido.domain.UnidadeMedida;
import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;

@ViewController
@PreviousView("./produto_list.jsf")
public class ProdutoEditMB extends AbstractEditPageBean<Produto, Long> {

	private static final long serialVersionUID = 1L;

	@Inject
	private ProdutoBC produtoBC;
	
	private Integer posicao;
	private BigDecimal somatorio;
	
	public BigDecimal getSomatorio() {
		somatorio = BigDecimal.ZERO;
		if (this.getBean().getListaProdutoProdutos() != null && this.getBean().getListaProdutoProdutos().size() >0 ) {
			for (ProdutoProduto pp : this.getBean().getListaProdutoProdutos()) {
				somatorio = somatorio.add(pp.getProdutoFilho().getValor().multiply(new BigDecimal(pp.getQuantidade())));
			}
		}
		return somatorio;
	}

	public void setSomatorio(BigDecimal somatorio) {
		this.somatorio = somatorio;
	}

	@Inject
	private UnidadeMedidaBC unidadeMedidaBC;
	private List<SelectItem> unidadeMedidas;
	private Long unidadeMedida;
	
	public List<SelectItem> getUnidadeMedidas() {
		unidadeMedidas = new ArrayList<SelectItem>();
		List<UnidadeMedida> lista = unidadeMedidaBC.findAll();
		for (UnidadeMedida obj: lista) {
			unidadeMedidas.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}
		return unidadeMedidas;
	}

	public void setUnidadeMedidas(List<SelectItem> unidadeMedidas) {
		this.unidadeMedidas = unidadeMedidas;
	}

	public Long getUnidadeMedida() {
		if(unidadeMedida == null && this.getBean().getUnidadeMedida() != null)
			unidadeMedida = this.getBean().getUnidadeMedida().getId();

		return unidadeMedida;
	}

	public void setUnidadeMedida(Long unidadeMedida) {
		this.unidadeMedida = unidadeMedida;
	}
	
	@Inject
	private LocalProducaoBC localProducaoBC;
	private List<SelectItem> localProducaos;
	private Long localProducao;
	
	public List<SelectItem> getLocalProducaos() {
		localProducaos = new ArrayList<SelectItem>();
		List<LocalProducao> lista = localProducaoBC.findAll();
		for (LocalProducao obj: lista) {
			localProducaos.add(new SelectItem(obj.getId() , obj.getDescricao()));
		}
		return localProducaos;
	}

	public void setLocalProducaos(List<SelectItem> LocalProducaos) {
		this.localProducaos = LocalProducaos;
	}

	public Long getLocalProducao() {
		if(localProducao == null && this.getBean().getLocalProducao() != null)
			localProducao = this.getBean().getLocalProducao().getId();

		return localProducao;
	}

	public void setLocalProducao(Long LocalProducao) {
		this.localProducao = LocalProducao;
	}

	@Override
	@Transactional
	public String delete() {
		this.produtoBC.delete(getId());
		return getPreviousView();
	}

	private StreamedContent imagem;

	public StreamedContent getImagem() {
		if (this.getBean() != null && this.getBean().getImagem() != null && this.getBean().getImagem().length > 0) {
			try {
				imagem = new DefaultStreamedContent(new ByteArrayInputStream(this.getBean().getImagem()), this.getBean().getTipoImagem(), this.getBean().getNomeImagem());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return imagem;
	}

	public void montaObjeto() {
		if(this.getUnidadeMedida() != null)
			this.getBean().setUnidadeMedida(this.unidadeMedidaBC.load(this.getUnidadeMedida()));

		if(this.getLocalProducao() != null)
			this.getBean().setLocalProducao(this.localProducaoBC.load(this.getLocalProducao()));

		this.getBean().setImagem((byte[])FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("imagem"));
		this.getBean().setTipoImagem((String)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("contentType"));
		this.getBean().setNomeImagem((String)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("nomeArquivo"));

	}


	public Integer getQuantidade() {
		if (quantidade == null) 
			quantidade = 1;
		return quantidade;
	}

	public void setQuantidade(Integer quantidade) {
		this.quantidade = quantidade;
	}

	@Override
	@Transactional
	public String insert() {
		montaObjeto();
		this.produtoBC.insert(getBean());
		return getPreviousView();
	}
	
	@Override
	@Transactional
	public String update() {
		montaObjeto();
		this.produtoBC.update(getBean());
		return getPreviousView();
	}
	
	@Override
	protected Produto handleLoad(Long id) {
		setBean(this.produtoBC.load(id));

		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("imagem", this.getBean().getImagem());
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("contentType", this.getBean().getTipoImagem());
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("nomeArquivo", this.getBean().getNomeImagem());

		return getBean();
	}

	public void handleFileUpload(FileUploadEvent event) {
		this.getBean().setImagem(event.getFile().getContents());
		this.getBean().setNomeImagem(event.getFile().getFileName());
		this.getBean().setTipoImagem(event.getFile().getContentType());
		
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("imagem", event.getFile().getContents());
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("contentType", event.getFile().getContentType());
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("nomeArquivo", event.getFile().getFileName());
	}
	
	public void adicionarItem() {
		
		if (this.getProduto()  != null ) {
			boolean tem = false;
			
			Produto produtoNovo = this.produtoBC.load(this.getProduto());
			if (this.getBean() != null && this.getBean().getListaProdutoProdutos()  != null) {
				
				for (ProdutoProduto Produto : this.getBean().getListaProdutoProdutos()) {
					if (Produto.getProdutoFilho().getId().equals(produtoNovo.getId())) {
						tem = true;
					}
				}
			}
			
			if (!tem) {
				ProdutoProduto pp = new ProdutoProduto();
				pp.setProdutoFilho(produtoNovo);
				pp.setProdutoPai(this.getBean());
				pp.setQuantidade(this.getQuantidade());
				this.getBean().getListaProdutoProdutos().add(pp);

				this.setQuantidade(null);
				this.setProduto(null);
			} else {
//				facesContext.addMessage("listProdutos", new FacesMessage(bundle.getString(ConstantesMensagem.Produto_JA_ADICIONADA)));
			}
		}
	}

	public void removerItem() {
		if (this.posicao != null) {
			this.getBean().getListaProdutoProdutos().remove(this.posicao.intValue());
		}
	}


	private List<SelectItem> produtos;
	private Long produto;
	private Integer quantidade;

	public List<SelectItem> getProdutos() {
		produtos = new ArrayList<SelectItem>();
		List<Produto> lista = produtoBC.listarAtivos();
		for (Produto obj: lista) {
			if (!this.isUpdateMode()  || (this.isUpdateMode() && !obj.getId().equals(this.getBean().getId()) )) {
				produtos.add(new SelectItem(obj.getId(), obj.getDescricao()));
			}
		}

		return produtos;
	}

	public void setProdutos(List<SelectItem> produtos) {
		this.produtos = produtos;
	}

	public Long getProduto() {
		return produto;
	}

	public void setProduto(Long produto) {
		this.produto = produto;
	}

	public Integer getPosicao() {
		return posicao;
	}

	public void setPosicao(Integer posicao) {
		this.posicao = posicao;
	}
}